// Object.assign() - 将一个或多个源对象的所有可枚举属性的值复制到目标对象中
// Object.create() - 创建一个新对象，其中包含指定的原型对象和属性
// Object.defineProperty() - 将由给定描述符描述的命名属性添加到对象中
// Object.defineProperties() - 将由给定描述符描述的命名属性添加到对象中
// Object.entries() - 返回给定对象自己的可枚举属性[key，value]对的数组
// Object.freeze() - 冻结一个对象：其他代码无法删除或更改任何属性
// Object.fromEntries() - 将键值对列表转换为对象


// Object.assign() - 将一个或多个源对象的所有可枚举属性的值复制到目标对象中
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const result = Object.assign(target, source);
console.log(result); // { a: 1, b: 4, c: 5 }

// Object.create() - 创建一个新对象，其中包含指定的原型对象和属性
const person = {
  isHuman: false,
  printIntroduction: function () {
    console.log(`我的名字是${this.name}。我是人类吗？${this.isHuman}`);
  }
};

const me = Object.create(person);
me.name = "Alice";
me.isHuman = true;
me.printIntroduction(); // 我的名字是Alice。我是人类吗？true

// Object.defineProperty() - 将由给定描述符描述的命名属性添加到对象中
const object1 = {};
Object.defineProperty(object1, 'property1', {
  value: 42,
  writable: false
});
console.log(object1.property1); // 42
object1.property1 = 77; // 在严格模式下会抛出错误
console.log(object1.property1); // 42

// Object.defineProperties() - 将由给定描述符描述的命名属性添加到对象中
const object2 = {};
Object.defineProperties(object2, {
  property1: {
    value: 42,
    writable: false
  },
  property2: {}
});
console.log(object2.property1); // 42

// Object.entries() - 返回给定对象自己的可枚举属性[key，value]对的数组
const object3 = { a: 'somestring', b: 42 };
for (const [key, value] of Object.entries(object3)) {
  console.log(`${key}: ${value}`); // "a: somestring", "b: 42"
}

// Object.freeze() - 冻结一个对象：其他代码无法删除或更改任何属性
const obj = {
  prop: 42
};
Object.freeze(obj);
obj.prop = 33; // 在严格模式下会抛出错误
console.log(obj.prop); // 42

// Object.fromEntries() - 将键值对列表转换为对象
const entries = new Map([
  ['foo', 'bar'],
  ['baz', 42]
]);
const obj2 = Object
